package 二分法;

/**
 * @author： li
 * @date： 2022-01-17 15:46
 * @version 1.0
 */
/*
问题描述
　　你有n种牌，第i种牌的数目为ci。另外有一种特殊的牌：joker，它的数目是m。你可以用每种牌各一张来组成一套牌，
   也可以用一张joker和除了某一种牌以外的其他牌各一张组成1套牌。
   比如，当n=3时，一共有4种合法的套牌：{1,2,3}, {J,2,3}, {1,J,3}, {1,2,J}。
　　给出n, m和ci，你的任务是组成尽量多的套牌。每张牌最多只能用在一副套牌里（可以有牌不使用）。
输入格式
　　第一行包含两个整数n, m，即牌的种数和joker的个数。第二行包含n个整数ci，即每种牌的张数。
输出格式
　　输出仅一个整数，即最多组成的套牌数目。
样例输入
3 4
1 2 3
样例输出
3
样例说明
　　输入数据表明：一共有1个1，2个2，3个3，4个joker。最多可以组成三副套牌：{1,J,3}, {J,2,3}, {J,2,3}，joker还剩一个，其余牌全部用完。
数据规模和约定
　　50%的数据满足：2 < = n < = 5, 0 < = m < = 10^ 6, 0< = ci < = 200
　　100%的数据满足：2 < = n < = 50, 0 < = m, ci < = 500,000,000。
解题思路：
假设能组成x套牌，那么每种牌使用不超过x张。
因为不能重复，每套牌有n种不同的牌，然后把这n种牌都分到x套牌中后，
不够的要用Joker牌补上，但是Joker牌也不能重复，那么极限情况就是Joker牌最多补x张。
那么每次二分到的套数x就可以用补上的Joker牌的数量进行判断是否可行。
 */
import java.util.Scanner;
public class 扑克牌 {
    static long m,n;
    static int[] c =new int[54];//牌的种数
    static boolean check(long x)//套数
    {
        long cnt = 0;//需要补的joker牌的数量
        for (int i = 1; i <=n; i++) {
            if (c[i] < x) cnt += x - c[i];
        }
        return cnt <= x && cnt <= m;//补的牌的数量小于套数和joker牌数量
    }
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        n=sc.nextInt();
        m=sc.nextInt();
        for(int i=1;i<=n;i++)
            c[i]=sc.nextInt();
        long l=1,r= (long) 1e9;
        while (l+1<r)
        {
            long mid=(l+r)>>1;
            if (check(mid))
                l=mid;
            else r=mid-1;
        }
        System.out.println(r);;
    }
}